home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The X-Philes (2nd Revision)
/
The X-Philes Number 1 (1995).iso
/
xphiles
/
hp48hor1
/
fft.src
< prev
next >
Wrap
Text File
|
1991-05-29
|
2KB
|
63 lines
%%HP: T(3)F(,);
@ by Jurjen NE Bos
DIR
CST { { "FFT"
\<< 1 FFT
\>> } { "-FFT"
\<< -1 FFT
\>> } }
FFT @ FFT routine.
@ Input: 2: Vector 1: 1 for FFT, -1 for inverse
@ Ouput: 1: transformed vector
\<< OVER SIZE 1 GET
IF OVER 0 < @ Divide by length if inverse FFT
THEN ROT OVER / ROT ROT
END (0;6,28318530718) ROT * OVER / SWAP DUP
WHILE DUP 2 MOD NOT @ Divide out factors of 2
REPEAT 2 /
END SWAP OVER / \-> \Gr r p @ p: twopower, r: odd rest
@ rho: root of unity
\<< { r p } RDM
IF r 1 \=/ @ Compute regular r-point FFT p times simultaneously
THEN A\->L \Gr p * EXP 1 \-> m \Grp \Grn
\<< 1 r
START m 1 GET 1 2 r
FOR k \Grn * m k GET OVER * ROT + SWAP
NEXT DROP OBJ\-> DROP \Grp '\Grn' STO*
NEXT
\>> { r p } \->ARRY
END TRN CONJ @ TRN does transpose & conjugate, so conjugate back
WHILE p 1 \=/ @ combine r-point FFTs to 2r-point FFTs
REPEAT OBJ\-> DROP 'p' 2 STO/ { p r } \->ARRY TRN A\->L
@ from here on, we work with conjugated numbers!
\Gr NEG p * EXP 1 \-> m \Grp \Grn
\<< { p r } \->ARRY TRN 1 r
FOR k m k GET \Grn * OBJ\-> DROP \Grp '\Grn' STO*
NEXT
\>> { r p } \->ARRY + LASTARG - \-> m
\<< OBJ\-> DROP m
\>> OBJ\-> DROP 'r' 2 STO* { r p } \->ARRY TRN
@ numbers are normal again
END { r } RDM
\>>
\>>
A\->L @ convert matrix to list of rows. This doesn't use sigma+, because
@ this trick doesn't work with complex numbers :-(
\<< OBJ\-> OBJ\-> DROP { } \-> r c u
\<< 1 r
START c \->ARRY 'u' STO+
NEXT u
\>>
\>>
DFT @ The regular Fourier Transform. Extra short version.
\<< SWAP DUP SIZE 1 GET (0;6,28318530718) OVER / 4 PICK * \-> d x s q
\<< 0 s 1 -
FOR k '\GS(n=0;s-1;x(n+1)*EXP(q*k*n))' \->NUM
NEXT s \->ARRY
IF d -1 ==
THEN s /
END
\>>
\>>
END